﻿using System;
using System.Windows.Browser;

namespace Kugar.Core.SL4.Control
{

        /// <summary>  
        /// 提供一组方法和属性，可用于准确地测量运行时间。  
        /// </summary>  
        [ScriptableType()]
        internal sealed class StopWatch
        {
            #region 私有方法

            private int _StartTick = 0;
            private long _Elapsed = 0;
            private bool _IsRunning = false;

            #endregion

            #region 构造函数

            /// <summary>  
            /// 初始化 System.Diagnostics.Stopwatch 类的新实例。  
            /// </summary>  
            public StopWatch()
            {

            }

            #endregion

            #region 静态方法

            /// <summary>  
            /// 对新的 Stopwatch 实例进行初始化，将运行时间属性设置为零，然后开始测量运行时间。  
            /// </summary>  
            /// <returns>刚刚开始测量运行时间的 System.Diagnostics.Stopwatch。</returns>  
            public static StopWatch StartNew()
            {
                StopWatch sw = new StopWatch();
                sw.Start();

                return sw;
            }

            #endregion

            #region 私有方法

            private long _GetCurrentElapsed()
            {
                return _Elapsed + (IsRunning ? (Environment.TickCount - _StartTick) : 0);
            }

            #endregion

            #region 公有方法

            /// <summary>  
            /// 停止时间间隔测量，并将运行时间重置为零。  
            /// </summary>  
            public void Reset()
            {
                _Elapsed = 0;
                _IsRunning = false;
                _StartTick = 0;
            }

            /// <summary>  
            /// 开始或继续测量某个时间间隔的运行时间。  
            /// </summary>  
            public void Start()
            {
                if (!_IsRunning)
                {
                    _StartTick = Environment.TickCount;
                    _IsRunning = true;
                }
            }

            /// <summary>  
            /// 停止测量某个时间间隔的运行时间。  
            /// </summary>  
            public int Stop()
            {
                if (_IsRunning)
                {
                    _Elapsed += Environment.TickCount - _StartTick;

                    var y = Elapsed;

                    _IsRunning = false;

                    return (int)y.TotalMilliseconds;
                }
                else
                {
                    return 0;
                }
                
            }

            #endregion

            #region 公有属性

            /// <summary>  
            /// 获取一个指示 System.Diagnostics.Stopwatch 计时器是否在运行的值。  
            /// </summary>  
            public bool IsRunning { get { return _IsRunning; } }

            /// <summary>  
            /// 获取当前实例测量得出的总运行时间。  
            /// </summary>  
            public TimeSpan Elapsed { get { return new TimeSpan(this.ElapsedTicks); } }

            /// <summary>  
            /// 获取当前实例测量得出的总运行时间（以毫秒为单位）。  
            /// </summary>  
            public long ElapsedMilliseconds { get {  return Elapsed.Milliseconds; } } //return _GetCurrentElapsed() / TimeSpan.TicksPerMillisecond;

            /// <summary>  
            /// 获取当前实例测量得出的总运行时间（用计时器计时周期表示）。  
            /// </summary>  
            public long ElapsedTicks { get { return _GetCurrentElapsed() * 10000; } }

            #endregion
        }

}
